package main
/*
 basic  1 http://www.jb51.net/article/56723.htm
 basic  2 http://www.jb51.net/article/56726.htm
 basic  3 http://www.jb51.net/article/56768.htm

 */
import (
	"fmt"
	"math"
	"math/rand"
	"runtime"
)
var pointX,pointY string
var x =4
var xx float64=float64(x)
const PI  =3.14

func main() {
	fmt.Println(math.Pi)
	fmt.Println(addX(200000,2))
	pointX :="point x"
	pointY :=" point Y"
	pointX,pointY="x","y"
	fmt.Println(pointX + pointY )
	fmt.Println(PI )
	while()
	ifelse()
	//delay last location
	defer  deferop()
	switchos()
	kk:=float64(x)
	fmt.Print("FLOAT ",kk)
	//结构
	v := Point{1, 2}
	v.x = 4
	fmt.Println(v)

	aaaa :=Point{x:3,y:0} // 这时候 Y 为 0
	fmt.Print(aaaa.x)

	//指针
	p := Point{1, 2} // {1, 2} 为 struct literal
	q := &p // q 类型为 *Vertex
	q.x = 2 // 直接访问域 X


	cc := new(Point)
	fmt.Println(v)
	cc.x, cc.y = 11, 9
	fmt.Println(v)


	//数组
	var a [2]string
	a[0] = "Hello"
	a[1] = "World"
	fmt.Println(a[0], a[1])
	fmt.Println(a)

	//slice

	slice()

	rangeFun()
}

func addX(x int, y int) (sum int,del int) {
	sum= x+y
	del=x-y
	pointX,pointY="x","y"
	return
}


func while() {
	for i:=0;i<10;i++  {
		if i==9 {
			fmt.Println(i)
		}else {
			fmt.Print(i)
		}
	}
}



func ifelse() {

	n := rand.Intn(6);
	if n <=3  {
		fmt.Println("[0-3]",n)
	}else{
		fmt.Println("[4-6]",n)
	}
}

func switchos() {
	switch os:=runtime.NumCPU();os{
		case 1:
			fmt.Println("number CPU 1")
		case 2:
			fmt.Println("number CPU 2")

		case 3:
			fmt.Println("number CPU 3")
		case 4:
			fmt.Println("number CPU 4")
	}
}

func deferop(){
	for i:=1;i<10 ;i++  {
		defer  fmt.Print(i)
	}

}



type Point struct  {
	x int
	y int
}


func slice(){
	// 构建一个 slice
	//slice 是一个数据结构，其指向一个数组某个连续的部分。slice 用起来很像数组。[]T 为 slice 类型，其中元素类型为 T：

	p := []int{2, 3, 5, 7, 11, 13}
	fmt.Println("slice 1==", p)

	for i := 0; i < len(p); i++ {
		fmt.Printf("p[%d] == %d\n", i, p[i])
	}

//表达式 s[lo:hi] 用于创建一个 slice，新创建的 slice 的元素为 s 中 [lo, hi) 位置的元素。
	// len(a) 为 5
	a := make([]int, 5)
	fmt.Println("slice 2 ==", a)

//这里 make 函数会创建一个数组（其元素初始化为 0）并返回一个 slice 指向此数组。make 可以带第三个参数，用于指定容量
	// len(b) 为 0
	// cap(b) 为 5
	b := make([]int, 0, 5)

	b = b[:cap(b)] // len(b)=5, cap(b)=5
	b = b[1:] // len(b)=4, cap(b)=4

//一个没有值的 slice 是 nil，长度和容量都为 0。
	var z []int
	fmt.Println(z, len(z), cap(z))
	if z == nil {
		fmt.Println("nil!")
	}


}
var s = []int{11, 22, 33}
//range 被用在 for 中来迭代一个 slice 或者一个 map：
func rangeFun(){
	for i, v := range s {
		fmt.Println(i, v)
	}

	// 只需要值，使用 _ 忽略索引
	for _, v := range s {
		fmt.Println(v)
	}

	// 只需要索引
	for i := range s {
		fmt.Println(i)
	}
}

// map 用于映射 key 到 value（值）。map 可以通过 make 来创建

type Vertex struct {
	Lat, Long float64
}
var m map[string]Vertex

var m = map[string]Vertex{
	// 这里 Vertex 可以省略不写
	"Bell Labs": Vertex{
		40.68433, -74.39967,
	},
	"Google": Vertex{
		37.42202, -122.08408,
	},
}

/*
使用 [] 来访问 map 中的值，使用 delete 来删除 map 中的值：
复制代码 代码如下:

m[key] = elem
elem = m[key]
delete(m, key)

如果需要检查 map 中某 key 是否存在使用：
复制代码 代码如下:

elem, ok = m[key]

elem 表示 key 的值（key 不存在时，elem 为 0），ok 表示 key 是否存在。
*/

func mapFunc(){
	m = make(map[string]Vertex)
	m["Bell Labs"] = Vertex{
		40.68433, -74.39967,
	}
	fmt.Println(m["Bell Labs"])
}


//闭包
/*
a := adder()
fmt.Println(a(9527))
*/

func adder() func(int) int {
	sum := 0
	// 返回一个闭包，此闭包引用了外部变量 sum
	return func(x int) int {
		sum += x
		return sum
	}
}



